package concursos.controladores;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.el.ELResolver;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.event.RowEditEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

import concursos.interfaces.DisciplinaService;
import concursos.interfaces.ReferenciaService;
import concursos.modelos.Disciplina;
import concursos.modelos.Lembrete;
import concursos.modelos.Referencia;
import concursos.modelos.ReferenciaArquivo;
import concursos.modelos.ReferenciaLink;
import concursos.modelos.ReferenciaLivro;
import concursos.modelos.Usuario;

@ManagedBean
@SessionScoped
public class ReferenciaMB {

	@EJB
	private ReferenciaService beanReferencia;
	@EJB
	private DisciplinaService beanDisciplina;
	private List<Referencia> listaReferencias = new ArrayList<Referencia>();
	private List<Referencia> listaReferenciaLink = new ArrayList<Referencia>();
	private List<Referencia> listaReferenciaLivro = new ArrayList<Referencia>();
	private List<Referencia> listaReferenciaArquivo = new ArrayList<Referencia>();
	private ReferenciaLivro referenciaLivro = new ReferenciaLivro();
	private ReferenciaLink referenciaLink = new ReferenciaLink();
	private ReferenciaArquivo referenciaArquivo = new ReferenciaArquivo();
	private int idBusca, idExclusao;
	private Referencia referencia = new Referencia();
	private Referencia referenciaSelecionada;
	private Disciplina disciplinaSelecionada;
	private int id;
	
	private StreamedContent file;
	private String filtroBusca = "", filtroListar = "";

	public String getFiltroListar() {
		return this.filtroListar;
	}

	public void setFiltroListar(String filtroListar) {
		System.out.println("filtro para listar: " + filtroListar);
		this.filtroListar = filtroListar;
	}

	public void buscar() throws IOException {
		this.listaReferencias = this.beanReferencia.listarReferencia(this.disciplinaSelecionada.getId());
		System.out.println(this.disciplinaSelecionada.getId() + " Esse é o id");
		if (this.filtroListar.equals("link")) {
			this.listaReferenciaLink = new ArrayList<Referencia>();
			this.getListaReferencias();
			for (Referencia r : this.listaReferencias) {
				if (r instanceof ReferenciaLink) {
					this.listaReferenciaLink.add(r);
				}
			}

			FacesContext.getCurrentInstance().getExternalContext()
					.redirect("listarReferencias.xhtml");
		}

		if (this.filtroListar.equals("livro")) {
			this.listaReferenciaLivro = new ArrayList<Referencia>();
			this.getListaReferencias();
			for (Referencia r : this.listaReferencias) {
				if (r instanceof ReferenciaLivro) {
					this.listaReferenciaLivro.add(r);
				}
			}

			FacesContext.getCurrentInstance().getExternalContext()
					.redirect("listarReferencias.xhtml");
		}

		if (this.filtroListar.equals("arquivo")) {
			this.listaReferenciaArquivo = new ArrayList<Referencia>();
			this.getListaReferencias();
			for (Referencia r : this.listaReferencias) {
				if (r instanceof ReferenciaArquivo) {
					this.listaReferenciaArquivo.add(r);
				}
			}

			FacesContext.getCurrentInstance().getExternalContext()
					.redirect("listarReferencias.xhtml");
		}

	}

	public String getFiltroBusca() {
		return filtroBusca;
	}

	public void setFiltroBusca(String filtroBusca) {
		System.out.println("setando busca: " + filtroBusca);
		this.filtroBusca = filtroBusca;
	}

	public StreamedContent getFile() {
		return file;
	}

	public void setFile(StreamedContent file) {
		this.file = file;
	}

	public ReferenciaMB() {
		

	}

	public List<Referencia> getListaReferenciaLink() {
		return this.listaReferenciaLink;
	}

	public List<Referencia> getListaReferenciaLivro() {
		return this.listaReferenciaLivro;
	}

	public List<Referencia> getListaReferenciaArquivo() {
		return this.listaReferenciaArquivo;
	}

	public void cadastrarReferenciaLivro() {
		referenciaLivro.setDisciplina(this.disciplinaSelecionada);
		this.beanReferencia.cadastrarReferenciaLivro(this.referenciaLivro);
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Sucesso",
				"Referencia inserida com sucesso"));
		
		this.listaReferenciaLivro = new ArrayList<Referencia>();

		for (Referencia r : this.listaReferencias) {
			if (r instanceof ReferenciaLivro) {
				this.listaReferenciaLivro.add(r);
			}
		}

		this.referenciaLivro = new ReferenciaLivro();
		
		try {
			this.buscar();
		} catch (IOException exception) {
		}
	}

	public void cadastrarReferenciaLink() {
		referenciaLink.setDisciplina(this.disciplinaSelecionada);
		this.beanReferencia.cadastrarReferenciaLink(referenciaLink);
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Sucesso",
				"Referencia inserida com sucesso"));
		
		this.listaReferenciaLink = new ArrayList<Referencia>();
		this.listaReferencias = this.beanReferencia.listarReferencia(this.disciplinaSelecionada.getId());

		for (Referencia r : this.listaReferencias) {
			if (r instanceof ReferenciaLink) {
				this.listaReferenciaLink.add(r);
			}
		}

		this.referenciaLink = new ReferenciaLink();
		
		try {
			this.buscar();
		} catch (IOException exception) {
		}
	}

	public void adicionarArquivo(FileUploadEvent event) throws IOException {
		try {
			FacesContext context = FacesContext.getCurrentInstance();
			ELResolver resolver = context.getApplication().getELResolver();
			CadastrarDisciplinaMB disciplinaMB = (CadastrarDisciplinaMB) resolver
					.getValue(context.getELContext(), null, "cadastrarDisciplinaMB");
			Disciplina disciplina = disciplinaMB.getDisciplinaSelecionada();
			byte[] file = event.getFile().getContents();
			referenciaArquivo.setArquivo(file);
			referenciaArquivo.setNomeArquivo(event.getFile().getFileName());
			referenciaArquivo.setFormatoArquivo(event.getFile().getContentType());
			referenciaArquivo.setDisciplina(disciplina);
			this.beanReferencia.cadastrarReferenciaArquivo(referenciaArquivo);
			
			this.listaReferenciaArquivo = new ArrayList<Referencia>();
			this.getListaReferencias();
			for (Referencia r : this.listaReferencias) {
				if (r instanceof ReferenciaArquivo) {
					this.listaReferenciaArquivo.add(r);
				}
			}
			context.addMessage(null, new FacesMessage(event.getFile()
					.getFileName(),
					"O arquivo de referencia foi enviado com sucesso"));
		} catch (Exception ex) {
			System.out.println(ex);
		}
	}

	public void excluirReferenciaLivro() {
		this.beanReferencia.excluirReferenciaLivro(referenciaLivro);
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Sucesso",
				"Referencia excluida com sucesso"));
		this.buscarReferenciaPorDisciplina();
	}
	
	public void excluirReferenciaLink() {
		this.beanReferencia.excluirReferenciaLink(referenciaLink);
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Sucesso",
				"Referencia excluida com sucesso"));
		this.buscarReferenciaPorDisciplina();
	}
	public void excluirReferenciaArquivo() {
		this.beanReferencia.excluirReferenciaArquivo(referenciaArquivo);
		FacesContext context = FacesContext.getCurrentInstance();
		
		this.listaReferenciaArquivo = new ArrayList<Referencia>();
		this.getListaReferencias();
		for (Referencia r : this.listaReferencias) {
			if (r instanceof ReferenciaArquivo) {
				this.listaReferenciaArquivo.add(r);
			}
		}
		context.addMessage(null, new FacesMessage("Sucesso",
				"Referencia excluida com sucesso"));
	}

	public List<Referencia> listarReferencias() {
		this.listaReferencias = this.beanReferencia.listarReferencia(this.id);
		return this.listaReferencias;
	}

	public void buscarReferenciaPorDisciplina() {
		if (this.id == 0) {
			this.listaReferencias = this.beanReferencia.listarReferencia(this.id);
		} else
			this.listaReferencias = this.beanReferencia
					.buscarPorDisciplina(this.id);

		try {
			FacesContext.getCurrentInstance().getExternalContext()
					.redirect("listarReferencias.xhtml");
		} catch (IOException exception) {
		}
	}

	public void buscaPorId() {
		this.referencia = this.beanReferencia.buscaPorId(idBusca);
	}

	public ReferenciaService getBeanReferencia() {
		return beanReferencia;
	}

	public void setBeanReferencia(ReferenciaService beanReferencia) {
		this.beanReferencia = beanReferencia;
	}

	public DisciplinaService getBeanDisciplina() {
		return beanDisciplina;
	}

	public void setBeanDisciplina(DisciplinaService beanDisciplina) {
		this.beanDisciplina = beanDisciplina;
	}

	public List<Referencia> getListaReferencias() {
		return listaReferencias = this.beanReferencia.listarReferencia(this.disciplinaSelecionada.getId());
	}

	public void setListaReferencias(List<Referencia> listaReferencias) {
		this.listaReferencias = listaReferencias;
	}

	public int getIdBusca() {
		return idBusca;
	}

	public void setIdBusca(int idBusca) {
		this.idBusca = idBusca;
	}

	public int getIdExclusao() {
		return idExclusao;
	}

	public void setIdExclusao(int idExclusao) {
		this.idExclusao = idExclusao;
	}

	public Referencia getReferencia() {
		return referencia;
	}

	public void setReferencia(Referencia referencia) {
		this.referencia = referencia;
	}

	public Referencia getReferenciaSelecionada() {
		return referenciaSelecionada;
	}

	public void setReferenciaSelecionada(Referencia referenciaSelecionada) {
		this.referenciaSelecionada = referenciaSelecionada;
	}

	public Disciplina getDisciplinaSelecionada() {
		return disciplinaSelecionada;
	}

	public void setDisciplinaSelecionada(Disciplina disciplinaSelecionada) {
		this.disciplinaSelecionada = disciplinaSelecionada;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public List<Disciplina> getListaDisciplina() {
		return new ArrayList<Disciplina>(this.beanDisciplina.listarDisciplina(this.id));
	}

	public void selecionarReferenciaLivro(ReferenciaLivro r) {
		this.referenciaLivro = new ReferenciaLivro();
		this.referenciaLivro = r;
		
	}
	
	public void selecionarReferenciaLink(ReferenciaLink r) {
		this.referenciaLink = new ReferenciaLink();
		this.referenciaLink = r;
	}
	
	public void selecionarReferenciaArquivo(ReferenciaArquivo r) {
		this.referenciaArquivo = new ReferenciaArquivo();
		this.referenciaArquivo = r;
		InputStream stream = new ByteArrayInputStream(this.referenciaArquivo.getArquivo());
		file = new DefaultStreamedContent(stream, this.referenciaArquivo.getNomeArquivo());
	}

	public void selecionarDisciplina(Disciplina disciplina) {
		this.disciplinaSelecionada = new Disciplina();
		setDisciplinaSelecionada(disciplina);
		System.out.println("Disciplina selecionada" + disciplina.getNome());
	}

	public ReferenciaLivro getReferenciaLivro() {
		return referenciaLivro;
	}

	public void setReferenciaLivro(ReferenciaLivro referenciaLivro) {
		this.referenciaLivro = referenciaLivro;
	}

	public ReferenciaLink getReferenciaLink() {
		return referenciaLink;
	}

	public void setReferenciaLink(ReferenciaLink referenciaLink) {
		this.referenciaLink = referenciaLink;
	}

	public ReferenciaArquivo getReferenciaArquivo() {
		return referenciaArquivo;
	}

	public void setReferenciaArquivo(ReferenciaArquivo referenciaArquivo) {
		this.referenciaArquivo = referenciaArquivo;
	}
	
	public void onEditLink(RowEditEvent event) {
		this.beanReferencia.cadastrarReferenciaLink((ReferenciaLink) event.getObject());
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Sucesso",
				"Conteuda alterada com sucesso"));
	}
	
	public void onEditLivro(RowEditEvent event) {
		this.beanReferencia.cadastrarReferenciaLivro((ReferenciaLivro) event.getObject());
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Sucesso",
				"Referencia alterada com sucesso"));
	}

}
